[小ネタ] ECS Service Connect のクライアントで nginx を使う際の注意点
アノテーション・テクニカルサポートチームの hato です。
ECS Service Connect を利用した次の構成で、
「コンテナ1」の nginx が「コンテナ2」に通信できない事象を調査する機会がありましたので、小ネタとしてご紹介します。
※画像内の④の通信が名前解決エラーになる
※nginx のエラーログは502 Bad Gateway
でHost not found
2024/08/01 01:02:03 [error] 133#133: *2 hato-service-connect.local could not be resolved (3: Host not found), client: 203.0.113.1, server: localhost, request: "GET / HTTP/1.1", host: "203.0.113.2:8080"
原因
nginx で/etc/hosts
を参照しない設定内容になっていたためでした。
2024年8月時点の挙動として ECS Service Connect ではコンテナ内の/etc/hosts
を利用しています。
一方で nginx ではproxy_pass
で変数を利用している場合、/etc/hosts
は参照せずresolver
で指定した DNS サーバで名前解決を試みます。
# nginx.conf の例
set $backend hato-service-connect.local;
resolver 169.254.169.253 valid=5s;
location / {
proxy_pass http://$backend;
}
DNS サーバは、ECS Service Connect で利用するエンドポイントの名前解決ができないためHost not found
となります。
どう対応する?
変数に格納せず値を直接proxy_pass
で指定します。
直接指定している場合は、/etc/hosts
も参照する挙動のため名前解決が成功します。
# nginx.conf の例
location / {
proxy_pass http://hato-service-connect.local;
}
なお、変数を経由して指定するのは名前解決結果(IP アドレス)の変動に備えたワークアラウンドと思いますが、IP アドレスは127.255.0.1
固定でした。
Service Connect Agent の部分で振り分けを行っているため、IP アドレスの変動はそこで吸収されている模様です。
また、426 Upgrade Required
が発生する場合はproxy_http_version 1.1;
も追加してください。
# nginx.conf の例
location / {
proxy_http_version 1.1;
proxy_pass http://hato-service-connect.local;
}
参考資料
ちなみに、仕組みとしては/etc/hostsにDNSを書き込んで実現しているようです。
Parameter value can contain variables. In this case, if an address is specified as a domain name, the name is searched among the described server groups, and, if not found, is determined using a resolver.
Service Connect では、次に示すの機能はサポートされていません。
- Windows コンテナ
- HTTP 1.0
Sets the HTTP protocol version for proxying. By default, version 1.0 is used. Version 1.1 is recommended for use with keepalive connections and NTLM authentication.
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。